#include <stdint.h>

struct System_Object;
struct System_String;
struct Multiboot_Header;
struct Multiboot_MemoryMap;

void Init_System_Object(struct System_Object *obj);
void Init_System_String(struct System_String *obj);
void CreateString(struct System_String **obj, const char *s);
void Create_Ref_Array(void **arr_obj, int64_t num_elems);
uint64_t * Get_Ref_Elem(void *arr_obj, int64_t idx);
void Create_Byte_Array(void **arr_obj, int64_t num_elems);
uint8_t * Get_Byte_Elem(void *arr_obj, int64_t idx);
void Create_Char_Array(void **arr_obj, int64_t num_elems);
uint16_t * Get_Char_Elem(void *arr_obj, int64_t idx);
void Create_I_Array(void **arr_obj, int64_t num_elems);
int64_t * Get_I_Elem(void *arr_obj, int64_t idx);
void Create_I1_Array(void **arr_obj, int64_t num_elems);
int8_t * Get_I1_Elem(void *arr_obj, int64_t idx);
void Create_I2_Array(void **arr_obj, int64_t num_elems);
int16_t * Get_I2_Elem(void *arr_obj, int64_t idx);
void Create_I4_Array(void **arr_obj, int64_t num_elems);
int32_t * Get_I4_Elem(void *arr_obj, int64_t idx);
void Create_I8_Array(void **arr_obj, int64_t num_elems);
int64_t * Get_I8_Elem(void *arr_obj, int64_t idx);
void Create_U_Array(void **arr_obj, int64_t num_elems);
uint64_t * Get_U_Elem(void *arr_obj, int64_t idx);
void Create_U1_Array(void **arr_obj, int64_t num_elems);
uint8_t * Get_U1_Elem(void *arr_obj, int64_t idx);
void Create_U2_Array(void **arr_obj, int64_t num_elems);
uint16_t * Get_U2_Elem(void *arr_obj, int64_t idx);
void Create_U4_Array(void **arr_obj, int64_t num_elems);
uint32_t * Get_U4_Elem(void *arr_obj, int64_t idx);
void Create_U8_Array(void **arr_obj, int64_t num_elems);
uint64_t * Get_U8_Elem(void *arr_obj, int64_t idx);
void Init_Multiboot_Header(struct Multiboot_Header *obj);
void Init_Multiboot_MemoryMap(struct Multiboot_MemoryMap *obj);

struct System_Object {
    uint64_t __vtbl_0;
    int32_t __object_id;
};

struct System_String {
    uint64_t __vtbl_0;
    int32_t length;
    uint16_t start_char;
    uint64_t __vtbl_1;
    int32_t __object_id;
    uint64_t __vtbl_2;
    uint64_t __vtbl_3;
    uint64_t __vtbl_4;
    uint64_t __vtbl_5;
    uint64_t __vtbl_6;
    uint64_t __vtbl_7;
    uint64_t __vtbl_8;
};

struct Multiboot_Header {
    uint64_t __vtbl_0;
    uint64_t mmap;
    uint64_t heap_start;
    uint64_t heap_end;
    uint64_t virt_master_paging_struct;
    uint64_t virt_bda;
    uint64_t __vtbl_1;
    int32_t __object_id;
};

struct Multiboot_MemoryMap {
    uint64_t __vtbl_0;
    uint64_t base_addr;
    uint64_t length;
    int32_t type;
    uint64_t __vtbl_1;
    int32_t __object_id;
};

enum Multiboot_MemoryMapType {
    Available = 1,
    TLoad = 1002,
    Tysos = 1003,
    PagingStructure = 1004,
    Module = 1005,
    VideoHardware = 1006,
    BiosDataArea = 1007
};

